################################################################################
## windows本地数据库定时备份
## 可指定数据库, 可指定数据库保留的备份文件数量
## 2025年1月6日17:34:35
## 枫林晚
#################################################################################

import subprocess
import datetime
import os
import Utils

## 配置参数
# 替换为你的MySQL容器名称
docker_container_name = 'common-mysql'
# 容器内目录的挂载本机目录
backup_directory = 'D:/code/docker-common-service/data/mysql8/lib/db_backup'
# 容器内目录
container_backup_directory = '/var/lib/mysql/db_backup'
# 日志文件
fname = "D:/code/py/crontab/task_log.log"
# 替换为你想要备份的数据库列表 : 需要保留的备份文件数量
databases = {
    'cake': 20,
    'testing': 15

}

## 日志类
utils = Utils.Utils()
logger = utils.logger(log_file=fname)

for db in databases:
    logger.info(f"数据库: {db}, 保留备份文件数量: {databases[db]}")

# 获取当前日期时间，用于文件命名
now = datetime.datetime.now()
timestamp = now.strftime('%Y%m%d%H%M%S')

logger.warning("开始执行备份代码")

# 创建备份目录（如果不存在）
os.makedirs(backup_directory, exist_ok=True)

logString = ""
# 备份每个数据库
for db in databases:
    backup_file = f"{container_backup_directory}/{db}_{timestamp}.sql"
    try:
        # 使用Docker执行mysqldump命令
        subprocess.run([
            'docker', 'exec', docker_container_name,
            'mysqldump', '--user=root', '--password=123456', '--single-transaction', db,
            '-r', backup_file
        ], check=True)

        logger.info(f"备份成功: {backup_file},本机目录:{backup_directory}")
    except subprocess.CalledProcessError as e:

        logger.error(f"备份失败: {e}\n")

# 记录日志
now = datetime.datetime.now()
the_end_time = now.strftime("%Y-%m-%d %H:%M:%S")

logger.warning("数据库备份代码执行完成")

logger.warning("开始定时清除文件")
# 定时清除文件
# 遍历目录下的所有文件进行清除文件
def list_files(directory):
    for root, dirs, files in os.walk(directory):
        for db in databases:
            # 获取db前缀的文件的数量 保留10分最近的文件
            # 获取db前缀的文件的数量
            db_files = [f for f in files if f.startswith(db)]
            if len(db_files) > databases[db]:
                logger.info(f"{db}文件数量大于{databases[db]}，开始删除旧的文件")
            else:
                logger.info(f"{db}文件数量小于等于{databases[db]}，无需删除文件")
                continue

            # 按照文件创建时间排序
            db_files.sort(key=lambda x: os.path.getctime(os.path.join(root, x)))
            # 删除旧的文件
            for file in db_files[:-databases[db]]:
                os.remove(os.path.join(root, file))


# 使用函数
list_files(backup_directory)
logger.warning("完成定时清除文件")

logger.info("代码全部执行完成\n")



